/**
 * 错误码定义文件
 * 统一管理系统中的错误代码和错误消息，提供一致的错误处理
 */

// HTTP状态码错误
export const HTTP_ERROR_CODES = {
  // 客户端错误 4xx
  BAD_REQUEST: {
    code: 400,
    message: '请求参数错误',
    description: '请求语法错误或参数无效'
  },
  UNAUTHORIZED: {
    code: 401,
    message: '未授权访问',
    description: '用户未登录或登录已过期'
  },
  FORBIDDEN: {
    code: 403,
    message: '访问被拒绝',
    description: '用户没有权限访问此资源'
  },
  NOT_FOUND: {
    code: 404,
    message: '资源不存在',
    description: '请求的资源未找到'
  },
  METHOD_NOT_ALLOWED: {
    code: 405,
    message: '请求方法不允许',
    description: '使用了不被允许的HTTP方法'
  },
  CONFLICT: {
    code: 409,
    message: '资源冲突',
    description: '资源已存在或状态冲突'
  },
  VALIDATION_ERROR: {
    code: 422,
    message: '数据验证失败',
    description: '请求数据不符合验证规则'
  },
  TOO_MANY_REQUESTS: {
    code: 429,
    message: '请求过于频繁',
    description: '超出了请求频率限制'
  },

  // 服务端错误 5xx
  INTERNAL_SERVER_ERROR: {
    code: 500,
    message: '服务器内部错误',
    description: '服务器遇到意外情况'
  },
  BAD_GATEWAY: {
    code: 502,
    message: '网关错误',
    description: '上游服务器返回无效响应'
  },
  SERVICE_UNAVAILABLE: {
    code: 503,
    message: '服务不可用',
    description: '服务器暂时无法处理请求'
  },
  GATEWAY_TIMEOUT: {
    code: 504,
    message: '网关超时',
    description: '上游服务器响应超时'
  }
}

// 业务错误码
export const BUSINESS_ERROR_CODES = {
  // 通用错误 1000-1099
  UNKNOWN_ERROR: {
    code: 1000,
    message: '未知错误',
    description: '系统发生未知错误，请联系管理员'
  },
  SYSTEM_BUSY: {
    code: 1001,
    message: '系统繁忙',
    description: '系统当前繁忙，请稍后再试'
  },
  OPERATION_FAILED: {
    code: 1002,
    message: '操作失败',
    description: '操作执行失败，请重试'
  },
  INVALID_OPERATION: {
    code: 1003,
    message: '无效操作',
    description: '当前状态下不允许执行此操作'
  },

  // 认证授权错误 1100-1199
  LOGIN_REQUIRED: {
    code: 1100,
    message: '请先登录',
    description: '访问此功能需要登录'
  },
  LOGIN_FAILED: {
    code: 1101,
    message: '登录失败',
    description: '用户名或密码错误'
  },
  TOKEN_EXPIRED: {
    code: 1102,
    message: '登录已过期',
    description: '登录状态已过期，请重新登录'
  },
  TOKEN_INVALID: {
    code: 1103,
    message: '登录状态无效',
    description: '登录凭证无效，请重新登录'
  },
  PERMISSION_DENIED: {
    code: 1104,
    message: '权限不足',
    description: '您没有权限执行此操作'
  },
  ACCOUNT_LOCKED: {
    code: 1105,
    message: '账户已锁定',
    description: '账户已被锁定，请联系管理员'
  },
  ACCOUNT_DISABLED: {
    code: 1106,
    message: '账户已禁用',
    description: '账户已被禁用，无法登录'
  },
  PASSWORD_EXPIRED: {
    code: 1107,
    message: '密码已过期',
    description: '密码已过期，请修改密码'
  },

  // 数据验证错误 1200-1299
  REQUIRED_FIELD_MISSING: {
    code: 1200,
    message: '必填字段缺失',
    description: '请填写所有必填字段'
  },
  INVALID_FORMAT: {
    code: 1201,
    message: '格式不正确',
    description: '数据格式不符合要求'
  },
  VALUE_TOO_LONG: {
    code: 1202,
    message: '内容过长',
    description: '输入内容超出长度限制'
  },
  VALUE_TOO_SHORT: {
    code: 1203,
    message: '内容过短',
    description: '输入内容未达到最小长度要求'
  },
  INVALID_EMAIL: {
    code: 1204,
    message: '邮箱格式不正确',
    description: '请输入有效的邮箱地址'
  },
  INVALID_PHONE: {
    code: 1205,
    message: '手机号格式不正确',
    description: '请输入有效的手机号码'
  },
  INVALID_PASSWORD: {
    code: 1206,
    message: '密码格式不正确',
    description: '密码必须包含字母、数字，且长度不少于8位'
  },
  PASSWORD_MISMATCH: {
    code: 1207,
    message: '密码不匹配',
    description: '两次输入的密码不一致'
  },

  // 文章管理错误 1300-1399
  ARTICLE_NOT_FOUND: {
    code: 1300,
    message: '文章不存在',
    description: '指定的文章不存在或已被删除'
  },
  ARTICLE_TITLE_EXISTS: {
    code: 1301,
    message: '文章标题已存在',
    description: '该标题的文章已存在，请使用其他标题'
  },
  ARTICLE_SAVE_FAILED: {
    code: 1302,
    message: '文章保存失败',
    description: '文章保存时发生错误，请重试'
  },
  ARTICLE_PUBLISH_FAILED: {
    code: 1303,
    message: '文章发布失败',
    description: '文章发布时发生错误，请重试'
  },
  ARTICLE_DELETE_FAILED: {
    code: 1304,
    message: '文章删除失败',
    description: '文章删除时发生错误，请重试'
  },
  ARTICLE_STATUS_INVALID: {
    code: 1305,
    message: '文章状态无效',
    description: '文章状态不正确，无法执行此操作'
  },

  // 分类管理错误 1400-1499
  CATEGORY_NOT_FOUND: {
    code: 1400,
    message: '分类不存在',
    description: '指定的分类不存在或已被删除'
  },
  CATEGORY_NAME_EXISTS: {
    code: 1401,
    message: '分类名称已存在',
    description: '该分类名称已存在，请使用其他名称'
  },
  CATEGORY_HAS_ARTICLES: {
    code: 1402,
    message: '分类下有文章',
    description: '该分类下还有文章，无法删除'
  },
  CATEGORY_SAVE_FAILED: {
    code: 1403,
    message: '分类保存失败',
    description: '分类保存时发生错误，请重试'
  },
  CATEGORY_DELETE_FAILED: {
    code: 1404,
    message: '分类删除失败',
    description: '分类删除时发生错误，请重试'
  },

  // 标签管理错误 1500-1599
  TAG_NOT_FOUND: {
    code: 1500,
    message: '标签不存在',
    description: '指定的标签不存在或已被删除'
  },
  TAG_NAME_EXISTS: {
    code: 1501,
    message: '标签名称已存在',
    description: '该标签名称已存在，请使用其他名称'
  },
  TAG_HAS_ARTICLES: {
    code: 1502,
    message: '标签下有文章',
    description: '该标签下还有文章，无法删除'
  },
  TAG_SAVE_FAILED: {
    code: 1503,
    message: '标签保存失败',
    description: '标签保存时发生错误，请重试'
  },
  TAG_DELETE_FAILED: {
    code: 1504,
    message: '标签删除失败',
    description: '标签删除时发生错误，请重试'
  },

  // 文件上传错误 1600-1699
  FILE_REQUIRED: {
    code: 1600,
    message: '请选择文件',
    description: '请选择要上传的文件'
  },
  FILE_TOO_LARGE: {
    code: 1601,
    message: '文件过大',
    description: '文件大小超出限制，请选择更小的文件'
  },
  FILE_TYPE_NOT_ALLOWED: {
    code: 1602,
    message: '文件类型不支持',
    description: '不支持此文件类型，请选择其他文件'
  },
  FILE_UPLOAD_FAILED: {
    code: 1603,
    message: '文件上传失败',
    description: '文件上传时发生错误，请重试'
  },
  FILE_NOT_FOUND: {
    code: 1604,
    message: '文件不存在',
    description: '指定的文件不存在'
  },
  FILE_DELETE_FAILED: {
    code: 1605,
    message: '文件删除失败',
    description: '文件删除时发生错误，请重试'
  },

  // 系统设置错误 1700-1799
  SETTINGS_NOT_FOUND: {
    code: 1700,
    message: '设置项不存在',
    description: '指定的设置项不存在'
  },
  SETTINGS_SAVE_FAILED: {
    code: 1701,
    message: '设置保存失败',
    description: '系统设置保存时发生错误，请重试'
  },
  SETTINGS_INVALID_VALUE: {
    code: 1702,
    message: '设置值无效',
    description: '设置值不符合要求，请检查后重试'
  },

  // 网络错误 1800-1899
  NETWORK_ERROR: {
    code: 1800,
    message: '网络连接失败',
    description: '网络连接失败，请检查网络设置'
  },
  REQUEST_TIMEOUT: {
    code: 1801,
    message: '请求超时',
    description: '请求超时，请稍后重试'
  },
  CORS_ERROR: {
    code: 1802,
    message: '跨域请求被阻止',
    description: '跨域请求被浏览器阻止'
  }
}

// 错误等级
export const ERROR_LEVELS = {
  INFO: 'info',
  WARNING: 'warning',
  ERROR: 'error',
  CRITICAL: 'critical'
}

// 错误类型
export const ERROR_TYPES = {
  SYSTEM: 'system',        // 系统错误
  BUSINESS: 'business',    // 业务错误
  NETWORK: 'network',      // 网络错误
  VALIDATION: 'validation' // 验证错误
}

/**
 * 根据错误码获取错误信息
 * @param {number} code - 错误码
 * @returns {Object|null} 错误信息对象
 */
export function getErrorByCode(code) {
  // 查找HTTP错误码
  for (const key in HTTP_ERROR_CODES) {
    if (HTTP_ERROR_CODES[key].code === code) {
      return {
        ...HTTP_ERROR_CODES[key],
        type: ERROR_TYPES.NETWORK,
        level: code >= 500 ? ERROR_LEVELS.CRITICAL : ERROR_LEVELS.ERROR
      }
    }
  }

  // 查找业务错误码
  for (const key in BUSINESS_ERROR_CODES) {
    if (BUSINESS_ERROR_CODES[key].code === code) {
      let type = ERROR_TYPES.BUSINESS
      let level = ERROR_LEVELS.ERROR

      // 根据错误码范围确定类型和等级
      if (code >= 1200 && code < 1300) {
        type = ERROR_TYPES.VALIDATION
        level = ERROR_LEVELS.WARNING
      } else if (code >= 1800 && code < 1900) {
        type = ERROR_TYPES.NETWORK
        level = ERROR_LEVELS.ERROR
      } else if (code >= 1000 && code < 1100) {
        level = ERROR_LEVELS.CRITICAL
      }

      return {
        ...BUSINESS_ERROR_CODES[key],
        type,
        level
      }
    }
  }

  return null
}

/**
 * 根据错误类型获取所有错误码
 * @param {string} type - 错误类型
 * @returns {Array} 错误码数组
 */
export function getErrorsByType(type) {
  const errors = []

  if (type === ERROR_TYPES.NETWORK || type === ERROR_TYPES.SYSTEM) {
    Object.values(HTTP_ERROR_CODES).forEach(error => {
      errors.push({
        ...error,
        type: ERROR_TYPES.NETWORK,
        level: error.code >= 500 ? ERROR_LEVELS.CRITICAL : ERROR_LEVELS.ERROR
      })
    })
  }

  if (type === ERROR_TYPES.BUSINESS || type === ERROR_TYPES.VALIDATION) {
    Object.values(BUSINESS_ERROR_CODES).forEach(error => {
      let errorType = ERROR_TYPES.BUSINESS
      let level = ERROR_LEVELS.ERROR

      if (error.code >= 1200 && error.code < 1300) {
        errorType = ERROR_TYPES.VALIDATION
        level = ERROR_LEVELS.WARNING
      } else if (error.code >= 1800 && error.code < 1900) {
        errorType = ERROR_TYPES.NETWORK
      } else if (error.code >= 1000 && error.code < 1100) {
        level = ERROR_LEVELS.CRITICAL
      }

      if (type === errorType) {
        errors.push({
          ...error,
          type: errorType,
          level
        })
      }
    })
  }

  return errors
}

/**
 * 创建标准错误对象
 * @param {number} code - 错误码
 * @param {string} customMessage - 自定义错误消息
 * @param {any} data - 附加数据
 * @returns {Object} 标准错误对象
 */
export function createError(code, customMessage, data = null) {
  const errorInfo = getErrorByCode(code)

  if (!errorInfo) {
    return {
      code: code || 1000,
      message: customMessage || '未知错误',
      description: '系统发生未知错误',
      type: ERROR_TYPES.SYSTEM,
      level: ERROR_LEVELS.ERROR,
      data,
      timestamp: Date.now()
    }
  }

  return {
    ...errorInfo,
    message: customMessage || errorInfo.message,
    data,
    timestamp: Date.now()
  }
}

// 导出所有错误码和工具函数
export default {
  HTTP_ERROR_CODES,
  BUSINESS_ERROR_CODES,
  ERROR_LEVELS,
  ERROR_TYPES,
  getErrorByCode,
  getErrorsByType,
  createError
}